package clasificador.genetico.reglas;

import java.util.Random;

import clasificador.genetico.PoliticaMutacion;
import datos.AtributoFinito;
import java.util.List;

public class PoliticaMutacionReglas2 implements PoliticaMutacion<TGenotipo> {

    private double probMutacion;
    private Random r;
    private GeneradorReglas generador;
    private InterpretacionGenotipo interpretacion;

    public PoliticaMutacionReglas2(GeneradorReglas generador, InterpretacionGenotipo interpretacion, double probMutacion) {
        this.probMutacion = probMutacion;
        this.r = new Random();
        this.generador = generador;
        this.interpretacion = interpretacion;
    }

    @Override
    public boolean mutar(TGenotipo c) {
        int tam = c.size();
        for (int i = 0; i < tam; i++) {
        	
        	// Anadir reglas
            if(r.nextDouble() < probMutacion)
            {
                c.add(i,generador.generarRegla());
                tam++;
            }
            
            // Eliminar reglas
            if (r.nextDouble() < probMutacion) {
                c.remove(i);
                tam--;
                i--;
                continue;
            }        	

            for (int j = 0; j < c.get(i).l().length; j++) {
                if (r.nextDouble() < probMutacion) {
                    List<AtributoFinito> atributos = interpretacion.atributos;
                    int max = atributos.get(j).getRango().size();
                    int v = r.nextInt(max); 
                    int mascara = 1 << v;
                    int num = c.get(i).l()[j];
                    // Esta cosa tan bonita lo que hace es cambiar un bit.
                    c.get(i).l()[j] = (~(num & mascara)) | (num & ~mascara);
                }
            }
        }
       
        return true;
    }
}
